import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';
import Store from '../store';

export const error = {
    v: "#VALUE!",    // 错误的参数或运算符
    n: "#NAME?",     // 公式名称错误
    na: "#N/A",      // 函数或公式中没有可用数值
    r: "#REF!",      // 删除了由其他公式引用的单元格
    d: "#DIV/0!",    // 除数是0或空单元格
    nm: "#NUM!",     // 当公式或函数中某个数字有问题时
    nl: "#NULL!",    // 交叉运算符（空格）使用不正确
    sp: "#SPILL!"    // 数组范围有其它值
};

// 是否是空值
function isRealNull (val) {
    if (val == null || val.toString().replace(/\s/g, "") == "") {
        return true;
    } else {
        return false;
    }
}

// 是否是纯数字
function isRealNum (val) {
    if (val == null || val.toString().replace(/\s/g, "") === "") {
        return false;
    }

    if (typeof val == "boolean") {
        return false;
    }

    if (!isNaN(val)) {
        return true;
    } else {
        return false;
    }
}

// 是否是错误类型
function valueIsError (value) {
    let isError = false;

    for (let x in error) {
        if (value == error[x]) {
            isError = true;
            break;
        }
    }

    return isError;
}

// 是否有中文
function hasChinaword (s) {
    let patrn = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi;

    if (!patrn.exec(s)) {
        return false;
    } else {
        return true;
    }
}

// 是否为非编辑模式
function isEditMode () {
    if (luckysheetConfigsetting.editMode) {
        return true;
    } else {
        return false;
    }
}

/**
 * @description: 检查是否允许前台进行表格编辑
 * @param {*}
 * @return {Boolean} true:允许编辑 fasle:不允许
 */
function checkIsAllowEdit () {
    if (Store.allowEdit) {
        return true;
    } else {
        return false;
    }
}

// 范围是否只包含部分合并单元格
function hasPartMC (cfg, r1, r2, c1, c2, order) {
    let hasPartMC = false;
    let curConfig = Store.config.merge;
    if (order !== undefined) {
        curConfig = Store.luckysheetfile[order].config;
    }
    if (!curConfig) return hasPartMC;
    for (let x in curConfig.merge) {
        let mc = cfg.merge[x];

        if (r1 < mc.r) {
            if (r2 >= mc.r && r2 < (mc.r + mc.rs - 1)) {
                if (c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 < mc.c && c2 > (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                }
            } else if (r2 >= mc.r && r2 == (mc.r + mc.rs - 1)) {
                if (c1 > mc.c && c1 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c2 > mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 == mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 > mc.c && c2 == (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                }
            } else if (r2 > (mc.r + mc.rs - 1)) {
                if (c1 > mc.c && c1 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c2 >= mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 == mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 > mc.c && c2 == (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                }
            }
        } else if (r1 == mc.r) {
            if (r2 < (mc.r + mc.rs - 1)) {
                if (c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 < mc.c && c2 > (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                }
            } else if (r2 >= (mc.r + mc.rs - 1)) {
                if (c1 > mc.c && c1 <= (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c2 >= mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 == mc.c && c2 < (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                } else if (c1 > mc.c && c2 == (mc.c + mc.cs - 1)) {
                    hasPartMC = true;
                    break;
                }
            }
        } else if (r1 <= (mc.r + mc.rs - 1)) {
            if (c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)) {
                hasPartMC = true;
                break;
            } else if (c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)) {
                hasPartMC = true;
                break;
            } else if (c1 < mc.c && c2 > (mc.c + mc.cs - 1)) {
                hasPartMC = true;
                break;
            }
        }
    }

    return hasPartMC;
}

// 获取单个字符的字节数
function checkWordByteLength (value) {
    return Math.ceil(value.charCodeAt().toString(2).length / 8);
}

export {
    isRealNull,
    isRealNum,
    valueIsError,
    hasChinaword,
    isEditMode,
    checkIsAllowEdit,
    hasPartMC,
    checkWordByteLength
};
